package cn.org.xwb.bookmall.user.service.impl;

import cn.org.xwb.bookmall.model.service.impl.ProductCategoryServiceImpl;
import cn.org.xwb.bookmall.model.service.impl.ProductServiceImpl;
import cn.org.xwb.bookmall.model.vo.ProductCategoryVo;
import cn.org.xwb.bookmall.model.vo.ProductVo;
import cn.org.xwb.bookmall.user.service.UserProductService;
import cn.org.xwb.common.model.vo.RespResult;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.Random;

@Service
public class UserProductServiceImpl implements UserProductService {

    @Autowired
    private ProductServiceImpl productService;

    @Autowired
    private ProductCategoryServiceImpl productCategoryService;

    /**
     * 从缓存中获取全部的商品分类
     *
     * @return
     */
    @Override
    public RespResult<Object> getProductCategoryAll() {
        // 从缓存中获取全部的商品分类
        List<ProductCategoryVo> productCategoryVos = productCategoryService.findAllFromCacheWithImg();
        if (Objects.isNull(productCategoryVos)) return RespResult.fail("获取商品分类列表失败，请稍后重新尝试");
        // 过滤无子级分类的商品分类
        productCategoryVos = productCategoryVos.stream().filter(productCategoryVo -> productCategoryVo.getSubs().size() > 0).toList();
        return RespResult.success("获取商品分类列表成功", productCategoryVos);
    }

    /**
     * 从缓存中获取所有的商品信息，并过滤掉已删除商品和无商品图片的商品
     *
     * @return
     */
    private List<ProductVo> getAllWithFilterFromCache() {
        // 获取缓存的所有商品信息
        List<ProductVo> productVos = productService.findAllFromCache();
        // 过滤已删除商品
        productVos = productVos.stream().filter(productVo -> !productVo.getIsRemove()).toList();
        // 过滤掉无商品图片的商品
        productVos = productVos.stream().filter(productVo -> productVo.getImgs().size() > 0).toList();
        return productVos;
    }

    /**
     * 随机获取指定个数商品的商品列表
     *
     * @param productCount
     * @param productCategoryId
     * @param productCategorySubId
     * @return
     */
    @Override
    public RespResult<Object> getProductListRandom(Long productCount, Long productCategoryId, Long productCategorySubId) {
        // 获取过滤被逻辑删除的书籍商品后的所有书籍商品
        List<ProductVo> productVos = getAllWithFilterFromCache();
        // 根据分类进行过滤
        if (Objects.nonNull(productCategoryId))
            productVos = productVos.stream().filter(productVo -> productVo.getProductCategoryId() == productCategoryId).toList();
        if (Objects.nonNull(productCategorySubId))
            productVos = productVos.stream().filter(productVo -> productVo.getProductCategorySubId() == productCategorySubId).toList();
        productVos = productVos.stream().filter(productVo -> productVo.getIsRemove() == false).toList();
        if (productVos.size() <= 0) return RespResult.success("获取商品列表成功", productVos);
        // 随机返回的指定个数书籍商品的列表
        ArrayList<ProductVo> productVos1 = new ArrayList<>();
        for (int i = 0; i < productCount; i++) {
            // 获取随机的符合条件的书籍商品的索引
            int nextInt = new Random().nextInt(productVos.size());
            // 随机选取的书籍商品加入要返回客户端的列表中
            productVos1.add(productVos.get(nextInt));
        }
        return RespResult.success("获取商品列表成功", productVos1);
    }

    /**
     * 根据 id 获取商品信息
     *
     * @param productId
     * @return
     */
    @Override
    public RespResult<Object> getProductById(Long productId) {
        // 获取过滤后的所有商品
        List<ProductVo> productVos = getAllWithFilterFromCache();
        // 查询指定 id 的商品信息
        for (ProductVo productVo : productVos) {
            if (productVo.getId() == productId) {
                return RespResult.success("查询商品信息成功", productVo);
            }
        }
        return RespResult.fail("查询商品信息失败");
    }
}
